<?php

/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id: lib_tree.php 23684 2011-08-04 02:24:59Z cnteacher $
 */
if (!defined('IN_DISCUZ')) {
    exit('Access Denied');
}

/**
 * 树状节点数据处理类
 * 
 * @package discuz.x.lib.tree
 */
class lib_tree
{
    /**
     * 
     * @var array 所有节点数据
     */
    public $data = array();
    
    /**
     *
     * @var array 子节点层级数据
     */
    public $child = array(-1 => array());
    
    /**
     *
     * @var array 
     */
    public $layer = array(-1 => -1);
    
    /**
     *
     * @var array 父节点层级数据 
     */
    public $parent = array();
    public $countid = 0;

    public function __construct()
    {
        
    }

    /**
     * 设置一个节点数据
     * @param integer $id 当前节点ID
     * @param integer $parent 父节点ID
     * @param mixed $value 节点数据
     */
    public function setNode($id, $parent, $value)
    {

        $parent = $parent ? $parent : 0;

        $this->data[$id] = $value;
        $this->child[$parent][] = $id;
        $this->parent[$id] = $parent;

        if (!isset($this->layer[$parent])) {
            $this->layer[$id] = 0;
        } else {
            $this->layer[$id] = $this->layer[$parent] + 1;
        }
    }

    /**
     * 获取列表数据
     * @param array $tree
     * @param integer $root
     */
    public function getList(&$tree, $root = 0)
    {
        foreach ($this->child[$root] as $key => $id) {
            $tree[] = $id;
            if ($this->child[$id])
                $this->getList($tree, $id);
        }
    }

    /**
     * 获取指定节点的数据
     * @param integer $id
     * @return mixed
     */
    public function getValue($id)
    {
        return $this->data[$id];
    }

    /**
     * 递归设置指定节点的层数
     * @param integer $id
     */
    public function reSetLayer($id)
    {
        if ($this->parent[$id]) {
            $this->layer[$this->countid] = $this->layer[$this->countid] + 1;
            $this->reSetLayer($this->parent[$id]);
        }
    }

    /**
     * 树状结构在显示时，需要按层级缩进
     * @param integer $id 节点ID
     * @param boolean $space 是否以对应数量的空格返回
     * @return integer|string
     */
    public function getLayer($id, $space = false)
    {
        $this->layer[$id] = 0;
        $this->countid = $id;
        $this->reSetLayer($id);
        
        return $space ? str_repeat($space, $this->layer[$id]) : $this->layer[$id];
    }

    /**
     * 获取指定节点的父一级节点
     * @param integer $id
     * @return mixed
     */
    public function getParent($id)
    {
        return $this->parent[$id];
    }

    /**
     * 获取指定节点所有父节点
     * @param integer $id
     * @return array
     */
    public function getParents($id)
    {
        while ($this->parent[$id] != -1) {
            $id = $parent[$this->layer[$id]] = $this->parent[$id];
        }

        ksort($parent);
        reset($parent);

        return $parent;
    }

    /**
     * 获取指定节点的子一级节点
     * @param string $id
     * @return mixed
     */
    public function getChild($id)
    {
        return $this->child[$id];
    }

    /**
     * 获取指定节点的所有子节点
     * @param integer $id
     * @return array
     */
    public function getChilds($id = 0)
    {
        $child = array();
        $this->getList($child, $id);

        return $child;
    }

}

